/*
 *
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nexus.adec;

import com.sun.org.apache.bcel.internal.generic.IFEQ;
import control.MessageFactory;
import control.UserBean;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;
import org.apache.myfaces.custom.navmenu.NavigationMenuItem;
import org.apache.poi.hssf.record.VCenterRecord;

public class ConfigurarPrivilegios {
    private String valoresSeleccionados[];
    private String funcionSeleccionada;
    private String textoABuscar;
    private String rolSeleccionado;
    private ArrayList<SelectItem> itemFunciones;  //no se toca funciona perfectamente
    private ArrayList<SelectItem> roles; //no se toca funciona perfectamente
    
    private ArrayList<SelectItem> filtrado;   //verificar correcto funcionamiento
    private ArrayList<Usuario> usuariosFiltrados; //verificar el funcionamiento de esto
    private ArrayList<Usuario> usuariosSeleccionados;//verificar configuracion 

    private ArrayList<PrivilegiosCarrera> carreras; //funciona mas o menos
   
    private String codigoEspacio;
    private boolean mostrarFiltro;

    public ConfigurarPrivilegios() {
        codigoEspacio = "";
        filtrado = new ArrayList<SelectItem>();
        carreras = new ArrayList<PrivilegiosCarrera>();
    }







    public ArrayList<SelectItem> getFiltrado() {
        filtrado = new ArrayList<SelectItem>();
        if(!codigoEspacio.equalsIgnoreCase(getUserBean().getCodigoCurso())) {
            //JOptionPane.showMessageDialog(null, "entro al if codigo espacio  "+funcionSeleccionada);
            usuariosFiltrados = new ArrayList<Usuario>();
            usuariosSeleccionados = GestorEspacioDB.getInstance().listarUsuariosFuncion(getUserBean().getCodigoCurso(),funcionSeleccionada );
            valoresSeleccionados = new String[usuariosSeleccionados.size()];
            for(int i = 0;i<valoresSeleccionados.length;i++) {
                valoresSeleccionados[i] = usuariosSeleccionados.get(i).getNombreUsuario();
            }
            obtenerFiltro(usuariosFiltrados, usuariosSeleccionados);
            codigoEspacio = getUserBean().getCodigoCurso();
        }

        if(usuariosFiltrados!=null && usuariosSeleccionados!=null) {
            //JOptionPane.showMessageDialog(null, "entro al seguno if codigo espacio "+usuariosFiltrados.size()+"----"+usuariosSeleccionados.size());
            usuariosSeleccionados = GestorEspacioDB.getInstance().listarUsuariosFuncion(getUserBean().getCodigoCurso(),funcionSeleccionada );
            valoresSeleccionados = new String[usuariosSeleccionados.size()];
            for(int i = 0;i<valoresSeleccionados.length;i++) {
                valoresSeleccionados[i] = usuariosSeleccionados.get(i).getNombreUsuario();
            }
            obtenerFiltro(usuariosFiltrados, usuariosSeleccionados);
            /*
            valoresSeleccionados = new String[usuariosSeleccionados.size()];
            for(int i = 0;i<valoresSeleccionados.length;i++) {
                valoresSeleccionados[i] = usuariosSeleccionados.get(i).getNombreUsuario();
            }
            TreeSet<Usuario> conjunto = new TreeSet<Usuario>();
            conjunto.addAll(usuariosFiltrados);
            conjunto.addAll(usuariosSeleccionados);
            usuariosFiltrados.addAll(usuariosSeleccionados);
            for (Usuario u : usuariosFiltrados) {
                SelectItem item = new SelectItem(u.getNombreUsuario(),u.getNombreCompleto());
                filtrado.add(item);
            }*/
        } else {
            //JOptionPane.showMessageDialog(null,"la lista de usuarios filtradoes es null o la usuarios seleccionados es null");
            filtrado = new ArrayList<SelectItem>();
            valoresSeleccionados = null;
            //JOptionPane.showMessageDialog(null, "Erro Configurar privilegios posiblemente los usuarios filtrados son igual a null");
        }
        String cadenaMostrarValoresSeleccionados="";
        for (int i = 0; i < valoresSeleccionados.length; i++) {
            cadenaMostrarValoresSeleccionados += valoresSeleccionados[i];
            cadenaMostrarValoresSeleccionados += ",";
        }
        String cadenaMostrarFiltrados="";
        for (SelectItem si: filtrado) {
            cadenaMostrarFiltrados+=si.getValue();
            cadenaMostrarFiltrados+=",";
        }
        //JOptionPane.showMessageDialog(null,"en el get filtrado de configurar privilegios \nS"+cadenaMostrarValoresSeleccionados+"\nF"+cadenaMostrarFiltrados);
        if(filtrado.size()<valoresSeleccionados.length) {
            valoresSeleccionados =  new String[0];
        }
        return filtrado;
    }

    public void changeFuncion(ValueChangeEvent cve){
        String value = (String)cve.getNewValue();
        funcionSeleccionada = value;
        //JOptionPane.showMessageDialog(null, "entro al metodo changeFuncion en ConfigurarPrivilegios y la fun sel "+funcionSeleccionada);
        if(funcionSeleccionada!=null&&!funcionSeleccionada.equals("")) {
            mostrarFiltro = true;
            filtrado = new ArrayList<SelectItem>();
            usuariosFiltrados = new ArrayList<Usuario>();
            usuariosSeleccionados = GestorEspacioDB.getInstance().listarUsuariosFuncion(getUserBean().getCodigoCurso(),funcionSeleccionada );
            
            valoresSeleccionados = new String[usuariosSeleccionados.size()];
            //JOptionPane.showMessageDialog(null, valoresSeleccionados.length+"  entro al if metodo changeFuncion en ConfigurarPrivilegios y el tam es "+usuariosSeleccionados.size());
            for(int i=0;i<valoresSeleccionados.length;i++) {
                valoresSeleccionados[i] = usuariosSeleccionados.get(i).getNombreUsuario();
            }

            obtenerFiltro(usuariosFiltrados, usuariosSeleccionados);
            /*
            int i=0;
            for (Usuario usuario : usuariosSeleccionados) {

                usuariosFiltrados.add(usuario);
                //SelectItem item = new SelectItem(usuario.getNombreUsuario(),usuario.getNombreCompleto());
                //filtrado.add(item);
                valoresSeleccionados[i++]=usuario.getNombreUsuario();

            }
            for (Usuario us : usuariosFiltrados) {
                SelectItem item = new SelectItem(us.getNombreUsuario(),us.getNombreCompleto());
                filtrado.add(item);
            }*/
            //JOptionPane.showMessageDialog(null,"los asignados son "+datoAsiganados);
        } else {
            mostrarFiltro = false;
        }
        //JOptionPane.showMessageDialog(null, value);

        //JOptionPane.showMessageDialog(null,valoresSeleccionados[0]+"valores selecionado "+valoresSeleccionados.length+"--"+usuariosFiltrados.get(0).getNombreUsuario()+" y los filtrados son "+usuariosFiltrados.size()+" y con funcion son "+conFuncion.get(0).getNombreUsuario()+"---"+conFuncion.size());
    }
    public void actionBuscar(ActionEvent event) {

        ArrayList<GrupoAcademico> grupos = new ArrayList<GrupoAcademico>();
        ArrayList<PrivilegiosCarrera> carreras = getCarreras();
        for (PrivilegiosCarrera priCarrera : carreras) {
            for (PrivilegiosMateria priMateria : priCarrera.getMaterias()) {
                for (PrivilegiosGrupo priGrupo : priMateria.getGrupos()) {
                    if(priGrupo.isSeleccionado()) {
                        //JOptionPane.showMessageDialog(null, "cod Carr "+priCarrera.getCodigoCarrera()+" cod mat "+itemMateria.getCodigoMateria()+" cod grup "+itemGrupo.getNombreGrupo());
                        GrupoAcademico g = new GrupoAcademico(priCarrera.getCodigoCarrera(), priMateria.getCodigoMateria(), priGrupo.getNombreGrupo());
                        grupos.add(g);
                    }
                }
            }
        }
        if(grupos.size()>0) {
            usuariosFiltrados = GestorEspacioDB.getInstance().listarUsuarios(getCodigoEspacio(),rolSeleccionado, grupos);
        } else {
            FacesMessage mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "sugerenciaFiltrar", "");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
            usuariosFiltrados = new ArrayList<Usuario>();
        }

        //JOptionPane.showMessageDialog(null,"el codigo es: "+getCodigoEspacio()+" el rol seleccionado es: "+rolSeleccionado+" la cantidad de usuarios es: "+ usuariosFiltrados.size()+" los grupo son"+grupos.size());
    }
    public void obtenerFiltro(ArrayList<Usuario> buscados,ArrayList<Usuario> selecionados) {
        filtrado = new ArrayList<SelectItem>();
        TreeSet<Usuario> conjunto = new TreeSet<Usuario>();
        conjunto.addAll(buscados);
        conjunto.addAll(selecionados);
        Iterator<Usuario> i = conjunto.iterator();
        while(i.hasNext()) {
            Usuario us = i.next();
            SelectItem item = new SelectItem(us.getNombreUsuario(),us.getNombreCompleto());
            filtrado.add(item);
        }
    }
    public void selectionChanged(ValueChangeEvent evt)
    {
        String idSelecionados[] = (String[]) evt.getNewValue();

        TreeSet<Usuario> conjunto = new TreeSet<Usuario>();
        conjunto.addAll(usuariosFiltrados);
        conjunto.addAll(usuariosSeleccionados);
        Iterator<Usuario> ite = conjunto.iterator();
        usuariosSeleccionados = new ArrayList<Usuario>();
        while(ite.hasNext()) {
            Usuario u = ite.next();
            for(String ids:idSelecionados) {
                if(ids.equalsIgnoreCase(u.getNombreUsuario())) {
                    usuariosSeleccionados.add(u);
                }
            }
        }
        /*
        for (String ids : idSelecionados) {
            for (Usuario us : usuariosFiltrados) {
                if(ids.equalsIgnoreCase(us.getNombreUsuario())) {
                    usuariosSeleccionados.add(us);
                }
            }
        }*/
    }










    

    public ArrayList<SelectItem> getItemFunciones() {
        itemFunciones = new ArrayList<SelectItem>();
        ArrayList<Funcion> funcioens = GestorEspacioDB.getInstance().listarFuncioneConfigurables();
        for (Funcion funcion : funcioens) {
            SelectItem item = new SelectItem(funcion.getCodigoFuncion(), funcion.getNombreFuncion());
            itemFunciones.add(item);
        }
        return itemFunciones;
    }

    public void setItemFunciones(ArrayList<SelectItem> itemFunciones) {
        this.itemFunciones = itemFunciones;
    }

    public ArrayList<SelectItem> getRoles() {
        roles = new ArrayList<SelectItem>();
        ArrayList<Rol> rls = GestorEspacioDB.getInstance().listarRoles();
        for (Rol rol : rls) {
            SelectItem item = new SelectItem(rol.getCodigoRolEspacio(),rol.getNombreRol());
            roles.add(item);
        }
        return roles;
    }

    public void setRoles(ArrayList<SelectItem> roles) {
        this.roles = roles;
    }

    public void setFiltrado(ArrayList<SelectItem> filtrado) {
        this.filtrado = filtrado;
    }

    /**
     * @return the valoresSeleccionados
     */
    public String[] getValoresSeleccionados() {
        TreeSet<Usuario> select = new TreeSet<Usuario>();
        select.addAll(usuariosSeleccionados);
        Iterator<Usuario> ite = select.iterator();
        valoresSeleccionados = new String[select.size()];
        int indice = 0;
        while(ite.hasNext()) {
            valoresSeleccionados[indice++] = ite.next().getNombreUsuario();
        }
        return valoresSeleccionados;
    }

    /**
     * @param valoresSeleccionados the valoresSeleccionados to set
     */
    public void setValoresSeleccionados(String[] valoresSeleccionados) {
        this.valoresSeleccionados = valoresSeleccionados;
    }

    /**
     * @return the funcionSeleccionada
     */
    public String getFuncionSeleccionada() {
        return funcionSeleccionada;
    }

    /**
     * @param funcionSeleccionada the funcionSeleccionada to set
     */
    public void setFuncionSeleccionada(String funcionSeleccionada) {
        this.funcionSeleccionada = funcionSeleccionada;
    }

    /**
     * @return the textoABuscar
     */
    public String getTextoABuscar() {
        return textoABuscar;
    }

    /**
     * @param textoABuscar the textoABuscar to set
     */
    public void setTextoABuscar(String textoABuscar) {
        this.textoABuscar = textoABuscar;
    }

    /**
     * @return the rolSeleccionado
     */
    public String getRolSeleccionado() {
        return rolSeleccionado;
    }

    /**
     * @param rolSeleccionado the rolSeleccionado to set
     */
    public void setRolSeleccionado(String rolSeleccionado) {
        this.rolSeleccionado = rolSeleccionado;
    }

    /**
     * @return the carreras
     */
    public ArrayList<PrivilegiosCarrera> getCarreras() {
        if(getCodigoEspacio()==null) {
            setCodigoEspacio(getUserBean().getCodigoCurso());
        }
        if(!codigoEspacio.equalsIgnoreCase(getUserBean().getCodigoCurso())){
            carreras = new ArrayList<PrivilegiosCarrera>();
            ArrayList<Carrera> cs = GestorEspacioDB.getInstance().listarCarrerasEspacio(getUserBean().getCodigoCurso());
            //JOptionPane.showMessageDialog(null, "la cantidad de carrera son "+cs.size());
            for (Carrera carrera : cs) {
                PrivilegiosCarrera itemC = new PrivilegiosCarrera(carrera.getNombreCarrera(), carrera.getCodigoCarrera(),getUserBean().getId(),getUserBean().getCodigoCurso());
                carreras.add(itemC);
            }
            codigoEspacio = getUserBean().getCodigoCurso();
        }
        return carreras;
    }

    /**
     * @param carreras the carreras to set
     */
    public void setCarreras(ArrayList<PrivilegiosCarrera> carreras) {
        this.carreras = carreras;
    }
    
    public UserBean getUserBean() {
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        UserBean ub =(UserBean) vr.resolveVariable(context, "userBean");
        return ub;
    }

    /**
     * @return the usuariosFiltrados
     */
    public ArrayList<Usuario> getUsuariosFiltrados() {
        return usuariosFiltrados;
    }

    /**
     * @param usuariosFiltrados the usuariosFiltrados to set
     */
    public void setUsuariosFiltrados(ArrayList<Usuario> usuariosFiltrados) {
        this.usuariosFiltrados = usuariosFiltrados;
    }
    public void actionGuardarCambios(ActionEvent event ) {
        // Aqui guarda los cambios de la asignacion de los privilegios
        ArrayList<String> idUsuario= new ArrayList<String>();
        valoresSeleccionados = getValoresSeleccionados();
        
        for (int i = 0; i < valoresSeleccionados.length; i++) {
            idUsuario.add(valoresSeleccionados[i]);
        }
        //JOptionPane.showMessageDialog(null,"la cantidad guardadad es "+valoresSeleccionados.length);
        GestorEspacioDB.getInstance().asignarFuncionUsuarios(getUserBean().getCodigoCurso(),funcionSeleccionada, idUsuario);
        FacesMessage mensaje;
        if(idUsuario.size()>0) {
             mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "correctaConfiguracionDePrivilegios", "");
        } else {
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "correctaConfiguraiconDePrivilegiosSinNadieAsignado", "");
        }
        FacesContext.getCurrentInstance().addMessage(null, mensaje);
    }

    /**
     * @return the codigoEspacio
     */
    public String getCodigoEspacio() {
        return codigoEspacio;
    }

    /**
     * @param codigoEspacio the codigoEspacio to set
     */
    public void setCodigoEspacio(String codigoEspacio) {
        this.codigoEspacio = codigoEspacio;
    }
    

    /**
     * @return the mostrarFiltro
     */
    public boolean isMostrarFiltro() {
        return mostrarFiltro;
    }

    /**
     * @param mostrarFiltro the mostrarFiltro to set
     */
    public void setMostrarFiltro(boolean mostrarFiltro) {
        this.mostrarFiltro = mostrarFiltro;
    }
}